
#Область ПрограммныйИнтерфейс

#Область ХранениеАлгоритмов

// Данные алгоритма.
// 
// Параметры:
//  Идентификатор -Строка -Идентификатор
// 
// Возвращаемое значение:
//  см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеАлгоритма
// Возвращаемое значение: 
// 	Неопределено - Алгоритм не найден
Функция ДанныеАлгоритма(Идентификатор) Экспорт
	//Сначала ищем в ДБФ
	БазаАлгоритмов = БазаХраненияАлгоритмов();
	
	БазаАлгоритмов.ТекущийИндекс = БазаАлгоритмов.Индексы.IDXID;
	Найдено = БазаАлгоритмов.Найти(Идентификатор, "=");
	
	ОписаниеАлгоритма = Неопределено;
	Если Найдено Тогда
		ОписаниеАлгоритма = УИ_АлгоритмыКлиентСервер.НовыйОписаниеАлгоритма();
		ЗаполнитьШапкуАлгоритмаПоБазеХранения(ОписаниеАлгоритма, БазаАлгоритмов);
		ДозаполнитьОписаниеАлгоритмаПослеЧтенияШапки(ОписаниеАлгоритма);
	КонецЕсли;
	БазаАлгоритмов.ЗакрытьФайл();

	Если ОписаниеАлгоритма <> Неопределено Тогда
		Возврат ОписаниеАлгоритма;
	КонецЕсли;

	

	Возврат ОписаниеАлгоритма;
КонецФункции

// Список алгоритмов.
// 
// Возвращаемое значение:
//  Массив из см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма
Функция СписокАлгоритмов() Экспорт
	МассивАлгоритмов = Новый Массив;//Массив из см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма
	
	ДополнитьСписокАлгоритмовИзДБФ(МассивАлгоритмов);
	ДополнитьСписокАлгоритмовИзХранилищаОбщихНастроек(МассивАлгоритмов);	
	
	Возврат МассивАлгоритмов;
КонецФункции

// Записать алгоритм.
// 
// Параметры:
//  ДанныеАлгоритма - см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеАлгоритма
//  Отказ - Булево
Процедура ЗаписатьАлгоритм(ДанныеАлгоритма, Отказ) Экспорт
	Если ДанныеАлгоритма.ВХранилищеНастроек Тогда
		ЗаписатьАлгоритмВХранилищеНастроек(ДанныеАлгоритма, Отказ);
	Иначе
		ЗаписатьАлгоритмВДБФ(ДанныеАлгоритма, Отказ);
	КонецЕсли;
КонецПроцедуры

// Удалить алгоритм.
// 
// Параметры:
//  Идентификатор - Строка -Идентификатор
Процедура УдалитьАлгоритм(Идентификатор) Экспорт
	
КонецПроцедуры

Процедура АлгоритмыНайтиПоНаименованию(Наименование) Экспорт
	
КонецПроцедуры

Процедура АлгоритмыНайтиПоКоду(Код) Экспорт
	
КонецПроцедуры

Функция АлгоритмыПустаяСсылка() Экспорт
	
КонецФункции

#КонецОбласти

// Описание
// 
// Параметры:
// 	НаименованиеАлгоритма - Строка - Название элемента справочника Алгоритмы, поиск происходит по наименованию 
// 	ТекстАлгоритма - Строка - Значение реквизита "ТекстАлгоритма"
// 	ПараметрN - Произвольное значение
// Возвращаемое значение:
// 	Строка Результат выполнения сохранения алгоритма
Функция СозданиеАлгоритма(НаименованиеАлгоритма, ТекстАлгоритма = "", Знач Параметр1 = Неопределено, 
	Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, 
	Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, 
	Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено, Знач МассивИменПараметров = Неопределено)  Экспорт
	
	АлгоритмыСсылка = Справочники.УИ_Алгоритмы.НайтиПоНаименованию(НаименованиеАлгоритма);
	Если АлгоритмыСсылка = Справочники.УИ_Алгоритмы.ПустаяСсылка() Тогда
		АлгоритмыОбъект = Справочники.УИ_Алгоритмы.СоздатьЭлемент();
		АлгоритмыОбъект.Наименование = НаименованиеАлгоритма;	
	Иначе	
		АлгоритмыОбъект = АлгоритмыСсылка.ПолучитьОбъект();
	КонецЕсли;
	Если ЗначениеЗаполнено(ТекстАлгоритма) Тогда
		АлгоритмыОбъект.ТекстАлгоритма = ТекстАлгоритма;
	КонецЕсли;
	
	СтруктураПараметров = Новый структура;
	ЗначениеПараметра = Неопределено;
	
	УстановитьБезопасныйРежим(Истина);
	Если ТипЗнч(МассивИменПараметров) <> Тип("Массив") Тогда
		МассивИменПараметров = Новый Массив;
	КонецЕсли;
	Для Параметр = 1 По 9 Цикл
		НазваниеПеременной = "Параметр" + Параметр;
		Выполнить("ЗначениеПараметра = " + НазваниеПеременной);
		ИмяПараметра = ?(МассивИменПараметров.Количество() >= Параметр, МассивИменПараметров[Параметр-1],"Параметр" + Параметр); 
		Если ЗначениеПараметра <> Неопределено Тогда
			СтруктураПараметров.Вставить(ИмяПараметра, ЗначениеПараметра);	
		КонецЕсли;
	КонецЦикла;	
	УстановитьБезопасныйРежим(Ложь);
	
	АлгоритмыОбъект.Хранилище = Новый ХранилищеЗначения(СтруктураПараметров);
	Попытка
		АлгоритмыОбъект.Записать();
	Исключение
		Возврат "Ошибка выполнения записи " + ОписаниеОшибки();
	КонецПопытки;
	
	Возврат  "Успешно сохранено";
КонецФункции

Функция ВыполнитьАлгоритм(Алгоритм) Экспорт
	Если Не ЗначениеЗаполнено(СокрЛП(Алгоритм.ТекстАлгоритма)) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	КонтекстВыполнения = ПолучитьПараметры(Алгоритм);

	РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(Алгоритм.ТекстАлгоритма, КонтекстВыполнения);

	Возврат РезультатВыполнения;
КонецФункции

Функция ПолучитьПараметры(Алгоритм) Экспорт
	ПараметрыХранилища = Алгоритм.Хранилище.Получить();
	Если ПараметрыХранилища = Неопределено ИЛИ ТипЗнч(ПараметрыХранилища) <> Тип("Структура")Тогда 
		ПараметрыХранилища =  Новый Структура;
	КонецЕсли;
	Возврат ПараметрыХранилища;
КонецФункции


#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс


// Каталог хранения алгоритмов.
// 
// Возвращаемое значение:
//  Строка -  Каталог хранения алгоритмов
Функция КаталогХраненияАлгоритмов() Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(УИ_ОбщегоНазначения.КаталогДанныхИнструментовНаСервере(),
														   "Алгоритмы");
КонецФункции
#КонецОбласти

#Область СлужебныеПроцедурыИФункции



#Область ХранениеАлгоритмовХранилищеОбщихНастроек

Функция КлючДанныхОбъектаАлгоритмовВХранилищеНастроек() Экспорт
	Возврат "УИ_УниверсальныеИнструменты_ХранилищеАлгоритмов";
КонецФункции

// Список алгоритмов.
// 
// Параметры:
//  МассивАлгоритмов - Массив из см.УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма 
// 
Процедура ДополнитьСписокАлгоритмовИзХранилищаОбщихНастроек(МассивАлгоритмов) 
	УстановитьПривилегированныйРежим(Истина);
	
	СтруктураПоиска=Новый Структура;
	СтруктураПоиска.Вставить("КлючОбъекта", КлючДанныхОбъектаАлгоритмовВХранилищеНастроек());

	Выборка=ХранилищеСистемныхНастроек.Выбрать(СтруктураПоиска);

	Пока Выборка.Следующий() Цикл
		ОписаниеШапки = УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма();
		ДанныеНастройки = Выборка.Настройки;
		Попытка
			ЗаполнитьЗначенияСвойств(ОписаниеШапки, ДанныеНастройки);
		Исключение
		КонецПопытки;
		
		МассивАлгоритмов.Добавить(ОписаниеШапки);
	КонецЦикла;
	
КонецПроцедуры

// Записать алгоритм в хранилище настроек.
// 
// Параметры:
//  ДанныеАлгоритма - см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеАлгоритма
//  Отказ - Булево -
Процедура ЗаписатьАлгоритмВХранилищеНастроек(ДанныеАлгоритма, Отказ)
	КлючНастроек = ДанныеАлгоритма.Идентификатор;// + "/" + ИмяПользователя() + "/" + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss;");

//		Если ЗначениеЗаполнено(Наименование) Тогда
//			КлючНастроек = КлючНастроек + "/" + Наименование;
//		КонецЕсли;

	КлючОбъектаАлгоритмов=КлючДанныхОбъектаАлгоритмовВХранилищеНастроек();

	Попытка
		УИ_ОбщегоНазначения.ХранилищеСистемныхНастроекСохранить(КлючОбъектаАлгоритмов, КлючНастроек, ДанныеАлгоритма);
	Исключение
		Отказ = Истина;
	КонецПопытки;
КонецПроцедуры

#КонецОбласти

#Область ДБФХранениеАлгоритма

// Каталог хранения доп данных алгоритма.
// 
// Параметры:
//  Идентификатор -Строка-Идентификатор
// 
// Возвращаемое значение:
//  Строка
Функция КаталогХраненияДопДанныхАлгоритма(Идентификатор)
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(УИ_ОбщегоНазначенияПовтИсп.КаталогХраненияАлгоритмов(),
														   "ДанныеАлгоритмов",
														   Идентификатор);
КонецФункции

// Записать алгоритм ВДБФ.
// 
// Параметры:
//  ДанныеАлгоритма - см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеАлгоритма
//  Отказ - Булево -
Процедура ЗаписатьАлгоритмВДБФ(ДанныеАлгоритма, Отказ)
	БазаАлгоритмов = БазаХраненияАлгоритмов(Истина);
	
	БазаАлгоритмов.ТекущийИндекс = БазаАлгоритмов.Индексы.IDXID;
	Найдено = БазаАлгоритмов.Найти(ДанныеАлгоритма.Идентификатор, "=");
	
	Если Не Найдено Тогда
		БазаАлгоритмов.Добавить();
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ДанныеАлгоритма.Идентификатор) Тогда
		ДанныеАлгоритма.Идентификатор = Строка(Новый УникальныйИдентификатор);
	КонецЕсли;
	БазаАлгоритмов.id = ДанныеАлгоритма.Идентификатор;
	БазаАлгоритмов.name = ДанныеАлгоритма.Наименование;
	БазаАлгоритмов.comment = ДанныеАлгоритма.Комментарий;
	БазаАлгоритмов.cashed = ДанныеАлгоритма.Кэшировать;
	БазаАлгоритмов.catch = ДанныеАлгоритма.ВыбрасыватьИсключение;
	БазаАлгоритмов.transact = ДанныеАлгоритма.ВыполнятьВТранзакции;
	БазаАлгоритмов.savejour = ДанныеАлгоритма.ЗаписыватьОшибкиВЖР;
	БазаАлгоритмов.httpid = ДанныеАлгоритма.ИдентификаторHTTP;
	БазаАлгоритмов.shedid = ДанныеАлгоритма.ИдентификаторРегламентногоЗадания;
	БазаАлгоритмов.sheduled = ДанныеАлгоритма.ВыполнятьПоРасписанию;
	БазаАлгоритмов.onclient = ДанныеАлгоритма.НаКлиенте;
	БазаАлгоритмов.CODE = ДанныеАлгоритма.Код;
	
	БазаАлгоритмов.Записать();
	БазаАлгоритмов.ЗакрытьФайл();
	
	КаталогХраненияДопДанныхАлгоритма = КаталогХраненияДопДанныхАлгоритма(ДанныеАлгоритма.Идентификатор);
	УИ_ОбщегоНазначения.ОбеспечитьКаталог(КаталогХраненияДопДанныхАлгоритма);

	ИмяФайлаТекста = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогХраненияДопДанныхАлгоритма,
																	УИ_АлгоритмыКлиентСервер.ИмяФайлаТекстаАлгоритмаDBF());
	
	Текст = Новый ТекстовыйДокумент();
	Текст.УстановитьТекст(ДанныеАлгоритма.ТекстАлгоритма);
	Текст.Записать(ИмяФайлаТекста, КодировкаТекста.UTF8);
КонецПроцедуры


// Шапка алгоритма из базы хранения.
// 
// Параметры:
// 	ОписаниеШапки - см. УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма
//  БазаХранения - XBase -База хранения
Процедура ЗаполнитьШапкуАлгоритмаПоБазеХранения(ОписаниеШапки,БазаХранения)
	ОписаниеШапки.Идентификатор = СокрЛП(БазаХранения.id);
	ОписаниеШапки.Наименование = СокрЛП(БазаХранения.name);
	ОписаниеШапки.Комментарий = СокрЛП(БазаХранения.comment);
	ОписаниеШапки.Кэшировать = БазаХранения.cashed;
	ОписаниеШапки.ВыбрасыватьИсключение = БазаХранения.catch;
	ОписаниеШапки.ВыполнятьВТранзакции = БазаХранения.transact;
	ОписаниеШапки.ЗаписыватьОшибкиВЖР = БазаХранения.savejour;
	ОписаниеШапки.ИдентификаторHTTP = СокрЛП(БазаХранения.httpid);
	ОписаниеШапки.ИдентификаторРегламентногоЗадания = СокрЛП(БазаХранения.shedid);
	ОписаниеШапки.ВыполнятьПоРасписанию = БазаХранения.sheduled;
	ОписаниеШапки.НаКлиенте = БазаХранения.onclient;
	ОписаниеШапки.Код = СокрЛП(БазаХранения.CODE);

КонецПроцедуры

Процедура ДозаполнитьОписаниеАлгоритмаПослеЧтенияШапки(ОписаниеАлгоритма) Экспорт
	КаталогДОпДанныхАлгоритма = КаталогХраненияДопДанныхАлгоритма(ОписаниеАлгоритма.Идентификатор);
	ИмяФайлаАлгоритма = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогДОпДанныхАлгоритма,
																	   УИ_АлгоритмыКлиентСервер.ИмяФайлаТекстаАлгоритмаDBF());
	
	Текст = Новый ТекстовыйДокумент();
	Текст.Прочитать(ИмяФайлаАлгоритма, КодировкаТекста.UTF8);
	
	ОписаниеАлгоритма.ТекстАлгоритма = Текст.ПолучитьТекст();
КонецПроцедуры

// Список алгоритмов.
// 
// Параметры:
//  МассивАлгоритмов - Массив из см.УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма 
// 
Процедура ДополнитьСписокАлгоритмовИзДБФ(МассивАлгоритмов) 
	БазаАлгоритмов = БазаХраненияАлгоритмов();
	ЕстьЗаписи = БазаАлгоритмов.Первая();
	Если Не ЕстьЗаписи Тогда
		Возврат;
	КонецЕсли;
	
	Пока Истина Цикл
		ОписаниеШапки = УИ_АлгоритмыКлиентСервер.НовыйОписаниеШапкиАлгоритма();
		ЗаполнитьШапкуАлгоритмаПоБазеХранения(ОписаниеШапки, БазаАлгоритмов);
		
		МассивАлгоритмов.Добавить(ОписаниеШапки);

		Если Не БазаАлгоритмов.Следующая() Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	БазаАлгоритмов.ЗакрытьФайл();
	
КонецПроцедуры

// Создать базу хранения алгоритмов.
// 
// Параметры:
//  ИмяФайлаХранения - Строка -  Имя файла хранения
//  ИмяФайлаИндексов - Строка -  Имя файла индексов
Процедура СоздатьБазуХраненияАлгоритмов(ИмяФайлаХранения, ИмяФайлаИндексов) 
	ДБФ = ОбъектXBaseХраненияАлгоритмов();
	ОбновитьСтруктуруХраненияШапки(ДБФ);
	ДБФ.СоздатьФайл(ИмяФайлаХранения);
	//ДБФ.СоздатьИндексныйФайл(ИмяФайлаИндексов);
	ДБФ.ЗакрытьФайл();
КонецПроцедуры

// База хранения алгоритмов.
// 
// Параметры:
//  ДляИзменения - Булево -  Для изменения
// 
// Возвращаемое значение:
//  XBase -  База хранения алгоритмов
Функция БазаХраненияАлгоритмов(ДляИзменения = Ложь) 
	КаталогХранения = УИ_ОбщегоНазначенияПовтИсп.КаталогХраненияАлгоритмов();
	УИ_ОбщегоНазначения.ОбеспечитьКаталог(КаталогХранения);

	ИмяФайлов = ИмяФайлаХранилищаАлгоритмов();
	
	ИмяФайлаХранения = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогХранения, ИмяФайлов+".DBF");
	ИмяФайлаИндексов = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогХранения, ИмяФайлов+".CDX");
		
	Файл = Новый Файл(ИмяФайлаХранения);
	Если не Файл.Существует() Тогда
		СоздатьБазуХраненияАлгоритмов(ИмяФайлаХранения, ИмяФайлаИндексов);
	КонецЕсли;
		
	ДБФ = ОбъектXBaseХраненияАлгоритмов();
	ДБФ.ОткрытьФайл(ИмяФайлаХранения, ИмяФайлаИндексов, Не ДляИзменения);
		
	Возврат ДБФ;	
КонецФункции

// Обновить структуру хранения шапки.
// 
// Параметры:
//  ДБФ -XBase-ДБФ
Процедура ОбновитьСтруктуруХраненияШапки(ДБФ)
	ДобавитьПолеХранения(ДБФ, "ID", "S", 40);
	ДобавитьПолеХранения(ДБФ, "NAME", "S", 150);
	ДобавитьПолеХранения(ДБФ, "CODE", "S", 9);
	ДобавитьПолеХранения(ДБФ, "COMMENT", "S", 150);
	ДобавитьПолеХранения(ДБФ, "CASHED", "L");
	ДобавитьПолеХранения(ДБФ, "CATCH", "L");
	ДобавитьПолеХранения(ДБФ, "TRANSACT", "L");
	ДобавитьПолеХранения(ДБФ, "SAVEJOUR", "L");
	ДобавитьПолеХранения(ДБФ, "HTTPID", "S", 25);
	ДобавитьПолеХранения(ДБФ, "SHEDID", "S", 50);
	ДобавитьПолеХранения(ДБФ, "SHEDULED", "L");
	ДобавитьПолеХранения(ДБФ, "ONCLIENT", "L");
	
	ДобавитьИндексПоПолюХранения(ДБФ, "IDXID", "ID", Истина);
	ДобавитьИндексПоПолюХранения(ДБФ, "IDXNAME", "NAME", Ложь);
	ДобавитьИндексПоПолюХранения(ДБФ, "IDXHTTPID", "HTTPID", Ложь);
	ДобавитьИндексПоПолюХранения(ДБФ, "IDXSHEDID", "SHEDID", Ложь);
КонецПроцедуры

// Добавить индекс по полю хранения.
// 
// Параметры:
//  ДБФ - XBase - ДБФ
//  Имя - Строка - Имя
//  Выражение - Строка- Выражение
//  Уникальность - Булево -Уникальность
Процедура ДобавитьИндексПоПолюХранения(ДБФ, Имя, Выражение, Уникальность)
	Индекс = ДБФ.Индексы.Найти(Имя);
	Если Индекс <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДБФ.Индексы.Добавить(Имя, Выражение, Уникальность);
КонецПроцедуры

Процедура ДобавитьПолеХранения(ДБФ, Имя, Тип, Длина = 0, Точность = 0)
	Поле = ДБФ.Поля.Найти(Имя);
	Если Поле <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДБФ.Поля.Добавить(Имя, Тип, Длина, Точность);
КонецПроцедуры

Функция ИмяФайлаХранилищаАлгоритмов()
	Возврат "ALGO";
КонецФункции

// Объект x base хранения алгоритмов.
// 
// Возвращаемое значение:
//  XBase -  Объект x base хранения алгоритмов
Функция ОбъектXBaseХраненияАлгоритмов() 
	ДБФ = Новый XBase;
	ДБФ.Кодировка = КодировкаXBase.ANSI;
	ДБФ.ОтображатьУдаленные = Ложь;
		
	Возврат ДБФ;
КонецФункции

#КонецОбласти

#КонецОбласти
